package main

import (
	"fmt"
	"github.com/sirupsen/logrus"
	"os"
	"time"
)

/*
	日志切割
		按时间切割  用hook方式
		按日志级别分割
*/
type FileDatehook struct {
	file     *os.File
	logPath  string
	fileDate string
	appName  string
}

func (F FileDatehook) Levels() []logrus.Level {
	//return []logrus.Level{logrus.ErrorLevel}
	return logrus.AllLevels
}
func (F FileDatehook) Fire(entry *logrus.Entry) error {
	time := entry.Time.Format("2006-01-02_15_04")
	line, _ := entry.String()
	if F.fileDate == time { //判断日期是否一样，如果一样，则开始写日志到文件中
		F.file.Write([]byte(line))
		return nil
	}
	//时间不等时
	F.file.Close()
	os.MkdirAll(fmt.Sprintf("%s/%s", F.logPath, time), os.ModePerm)
	filename := fmt.Sprintf("%s/%s/%s.log", F.logPath, time, F.appName)
	F.file, _ = os.OpenFile(filename, os.O_CREATE|os.O_APPEND|os.O_WRONLY, 0644)
	F.fileDate = time
	F.file.Write([]byte(line))
	return nil
}
func InitFile(logPath, appName string) {
	fileDate := time.Now().Format("2006-01-02_15_04")
	//创建目录
	err := os.MkdirAll(fmt.Sprintf("%s/%s", logPath, fileDate), os.ModePerm)
	if err != nil {
		logrus.Error(err)
		return
	}
	//定义日志文件名 拼接
	filename := fmt.Sprintf("%s/%s/%s.log", logPath, fileDate, appName)
	//打开日志文件
	file, err := os.OpenFile(filename, os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0644)
	if err != nil {
		logrus.Error(err)
		return
	}
	filehook := FileDatehook{file, logPath, fileDate, appName}
	logrus.AddHook(&filehook)
}
func main() {
	InitFile("logrus/logs", "test")
	for {
		logrus.Error("按时间进行日志切割")
		time.Sleep(20 * time.Second)
		logrus.Warnln("日志切割")
	}
}
